<?php defined('SYSPATH') or die('No direct script access.');
/**
 * Scheduler Controller (FAUX Cron)
 * Generates 1x1 pixel image while executing scheduled tasks
 *
 * PHP version 5
 * LICENSE: This source file is subject to LGPL license 
 * that is available through the world-wide-web at the following URI:
 * http://www.gnu.org/copyleft/lesser.html
 * @author     Ushahidi Team <team@ushahidi.com> 
 * @package    Ushahidi - http://source.ushahididev.com
 * @module     Scheduler Controller  
 * @copyright  Ushahidi - http://www.ushahidi.com
 * @license    http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License (LGPL) 
*/

class Scheduler_Controller extends Controller
{
	public function __construct()
    {
        parent::__construct();
		//$profiler = new Profiler;
	}
	
	public function index()
	{
		// Debug
		$debug = "";
		
		
		// Get all active scheduled items
		foreach (ORM::factory('scheduler')
			->where('scheduler_active','1')
			->find_all() as $scheduler)
		{
			$scheduler_id = $scheduler->id;
			$scheduler_last = $scheduler->scheduler_last;			  // Next run time
			$scheduler_weekday = $scheduler->scheduler_weekday;		  // Day of the week
			$scheduler_day = $scheduler->scheduler_day;				  // Day of the month
			$scheduler_hour = $scheduler->scheduler_hour;			  // Hour
			$scheduler_minute = $scheduler->scheduler_minute;		  // Minute
			
			// Controller that performs action
			$scheduler_controller = $scheduler->scheduler_controller;
			
			if ($scheduler_day <= -1) 
			{ // Ran every day?
				$scheduler_day = "*";
			}
			
			
			if ($scheduler_weekday <= -1) 
			{ // Ran every day?
				$scheduler_weekday = "*";
			}
			
			
			if ($scheduler_hour <= -1) 
			{ // Ran every hour?
				$scheduler_hour = "*";
			}
			
			
			if ($scheduler_minute <= -1) 
			{ // Ran every minute?
				$scheduler_minute = "*";
			}
			
			
			$scheduler_cron = $scheduler_minute . " " . $scheduler_hour . " " . $scheduler_day . " * " . $scheduler_weekday;
			
			//Start new cron parser instance    	
			$cron = new CronParser();
			
			if ( ! $cron->calcLastRan($scheduler_cron))
			{
				echo "Error parsing CRON";
			}
			
			$lastRan = $cron->getLastRan(); //Array (0=minute, 1=hour, 2=dayOfMonth, 3=month, 4=week, 5=year)
			$cronRan = mktime ($lastRan[1] ,$lastRan[0],0 , $lastRan[3] ,$lastRan[2], $lastRan[5]);
			
			if (isset($_GET['debug']) AND $_GET['debug'] == 1)
			{
				$debug .= "~~~~~~~~~~~~~~~~~~~~~~~~~~~"
				."<BR />~~~~~~~~~~~~~~~~~~~~~~~~~~~"
				."<BR />RUNNING: ".$scheduler->scheduler_name
				."<BR />~~~~~~~~~~~~~~~~~~~~~~~~~~~"
				."<BR /> LAST RUN: ".date("r", $scheduler_last)
				."<BR /> LAST DUE AT: ".date('r', $cron->getLastRanUnix())
				."<BR /> SCHEDULE: <a href=\"http://en.wikipedia.org/wiki/Cron\" target=\"_blank\">".$scheduler_cron."</a>";
			}
			
			if ( ! ($scheduler_last > $cronRan) || $scheduler_last == 0)
			//if ($scheduler_controller)
			{
				$run = Dispatch::controller("$scheduler_controller", "scheduler/")->method('index', '');
				
				if ($run !== FALSE)
				{					
					// Set last time of last execution
					$schedule_time = time();
					$scheduler->scheduler_last = $schedule_time;
					$scheduler->save();

					// Record Action to Log				
					$scheduler_log = new Scheduler_Log_Model();
					$scheduler_log->scheduler_id = $scheduler_id;
					$scheduler_log->scheduler_name = $scheduler->scheduler_name;
					$scheduler_log->scheduler_status = "200";
					$scheduler_log->scheduler_date = $schedule_time;
					$scheduler_log->save();

					if (isset($_GET['debug']) AND $_GET['debug'] == 1)
					{
						$debug .= "<BR /> STATUS: {{ EXECUTED }}";
					}
				}
				else
				{
					if (isset($_GET['debug']) AND $_GET['debug'] == 1)
					{
						$debug .= "<BR /> STATUS: {{ SCHEDULER NOT FOUND! }}";
					}
				}
				
			}
			else
			{
				if (isset($_GET['debug']) AND $_GET['debug'] == 1)
				{
					$debug .= "<BR /> STATUS: {{ NOT RUN }}";
				}
			}
			if (isset($_GET['debug']) AND $_GET['debug'] == 1)
			{
				//$debug .= "<BR /><BR />CRON DEBUG:<BR \>".nl2br($cron->getDebug());
				$debug .= "<BR \>~~~~~~~~~~~~~~~~~~~~~~~~~~~<BR />~~~~~~~~~~~~~~~~~~~~~~~~~~~<BR /><BR /><BR />";
			}
		}
		
		// If DEBUG is TRUE echo DEBUG info instead of transparent GIF
		if (isset($_GET['debug']) AND $_GET['debug'] == 1)
		{
			echo $debug;
		}
		else
		{
			// Transparent GIF
			Header( "Content-type: image/gif");
			Header( "Expires: Wed, 11 Nov 1998 11:11:11 GMT");
			Header( "Cache-Control: no-cache");
			Header( "Cache-Control: must-revalidate");
			Header( "Content-Length: 49");
			echo pack('H*',
				 '47494638396101000100910000000000ffffffff'
				.'ffff00000021f90405140002002c000000000100'
				.'01000002025401003b'
			);
		}
	}
}